/*
 * Block.h
 *
 *  Created on: Sep 18, 2011
 *      Author: Belen 
 *
 *  Bloques de longitud variable
 */

#ifndef BLOCK_H_
#define BLOCK_H_

#include "Block.h"
#include <stdio.h>
#include <string.h>

using namespace std;

class Block{

public:
	
	/*
	 * Devuelve el id del bloque dentro del archivo
	 */
	unsigned long getId();
	
	/*
	 * Setea el id del bloque (pos. del bloque dentro  del archivo)
	 */
	void setId(unsigned long xId);
	
	/*
	 *Devuelve cantidad de espacio libre del bloque. 
	 */
	unsigned long getFreeSpace();
	
	/*
	 *Devuelve cantidad de registros.  
	 */
	unsigned long getRecordCount();
	
	/*
	 * Devuelve 0 si es un bloque valido o 1 si el bloque est� libre. 
	 */
	char  getDirty(); 
	
	/*
	 * Devuelve el bloque representado en un char*
	 */
	char* getRawBlock();

	
	/*
	 * Agrega un registro de tamaño variable en el bloque
	 * devuelve false si no puede agregar el registro por falta de tamaño
	 */
	bool addRecord (char* record, unsigned long recordSize);

	/*
	 * Obtiene un registro por "posicion dentro del bloque" (cero es la primer pos)
	 */
	bool getRecord(unsigned long id, char** record, unsigned long* recordSize);

	/*
	 * Remueve un registro por "posicion dentro del bloque" (cero es la primer pos)
	 * Debe reacomodar el bloque para dejar a todos los registros de forma contigua
	 */
	bool deleteRecord(unsigned long id);

	void emptyBlock();

	Block(unsigned long blockSize);
	Block(char* serializedData,unsigned long blockSize);
	virtual ~Block();
	
private:


	void setFreeSpace(unsigned long _freeSpace);
	void setRecordCount(unsigned long _recordCount);


	unsigned long	id;
	unsigned long	freeSpace;
	unsigned long	recordCount;
	unsigned long	blockSize;		// NO SE GUARDA!!!
	
	char  dirty;
	char* rawBlock;

};

#endif /* BLOCK_H_ */
